package com.atguigu.lease.common.utils;

import com.atguigu.lease.common.exception.LeaseException;
import com.atguigu.lease.common.result.ResultCodeEnum;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.security.SignatureException;

import javax.crypto.SecretKey;
import java.util.Date;

/**
 * @Author :冉佳
 * @CreateTime: 2025-02-11 // jwt工具类 创建解析token
 * @Description:
 * @Version:1.0
 **/
public class JwtUtil {

    // token的过期时间 一小时
    private static final Long expire = 1000 * 60 * 60L;
    // 设置签名密钥
    private static final SecretKey secretKey = Keys.hmacShaKeyFor("57d02e18342345d8423b7689efbc3b0cdf850bfdef20fe58658f6ddbed58effb".getBytes());

    // 方法设置为静态 方便调用
    // 1. 创建token // claim(负载) 存储userName 和 userId这两个信息
    public static String createToken(String userName, Long userId) {

// 头 有默认值 可以不写(算法啥的)
        String token = Jwts.builder()
                .setSubject("login_token")
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .claim("userName", userName)
                .claim("userId", userId)
                .signWith(secretKey)
                .compressWith(CompressionCodecs.GZIP)
                .compact();// 组合为token字符串

        return token;

    }

    // 2. 解析token
    public static Claims parseToken(String token){

        Jws<Claims> claimsJwts = null;
        try {
            claimsJwts = Jwts.parserBuilder().setSigningKey(secretKey).build().parseClaimsJws(token);
        } catch (ExpiredJwtException e) {
            throw new LeaseException(ResultCodeEnum.TOKEN_EXPIRED);
        }catch (JwtException e){
            throw  new LeaseException(ResultCodeEnum.TOKEN_INVALID);
        }
        // body即为负载 // 检
        return claimsJwts.getBody();
    }
//    public static void main(String[] args) {
//        // 检验
//        String token = createToken("admin", 12l);
//        System.out.println(token);
//
//        Claims claims = parseToken(token);
//        System.out.println(claims);
//    }
}
